#include "test.h"
#include "header.h"
#include "interpretor.h"
#include "SudokuChecker.h"

void testHead()
{
	if (h_sudoku_problem_txt != INVALID_HANDLE_VALUE || h_sudoku_txt != INVALID_HANDLE_VALUE)
		return;
	Sudoku s1, s2;
	mallocSudoku(s1);
	mallocSudoku(s2);
	for (int i = 0; i < N_ROW_SUDOKU; i++)
		ZeroMemory(s1[i], sizeof(int) * N_ROW_SUDOKU);
	s2[1][1] = 1;
	if (checkRepeation(s1, s2) == 1)
		return;
	copySudoku(s1, s2);
	if (checkRepeation(s1, s2) == 0)
		std::cout << "Wrong" << std::endl;
}

void testSovlingSudoku(wchar_t** argv)
{
	lstrcpy(argv[0], L"sudoku.exe");
	lstrcpy(argv[1], L"-s");

	closeTxt();
	interpret(2, argv);
	lstrcpy(argv[2], L"E:\\");
	closeTxt();
	if (interpret(3, argv) != -5)return;

	lstrcpy(argv[2], L"E:\\problem1e5.txt");
	closeTxt();
	if (interpret(3, argv) != 0)return;
}

void testMakingSudoku(wchar_t** argv)
{
	lstrcpy(argv[0], L"sudoku.exe");
	lstrcpy(argv[1], L"-c");
	lstrcpy(argv[2], L"1000");

	closeTxt();
	if (interpret(3, argv) != 0)
		return;


	closeTxt();
	lstrcpy(argv[2], L"999999");
	if (interpret(3, argv) != 0)return;

	closeTxt();
	lstrcpy(argv[2], L"999998");
	if (interpret(3, argv) != 0)return;

	closeTxt();
	lstrcpy(argv[2], L"1");
	if (interpret(3, argv) != 0)return;

	closeTxt();
	lstrcpy(argv[2], L"2");
	if (interpret(3, argv) != 0)return;


	closeTxt();
	lstrcpy(argv[2], L"817");
	if (interpret(3, argv) != 0)return;

	closeTxt();
	lstrcpy(argv[2], L"5436");
	if (interpret(3, argv) != 0)return;
}

void testInterpretor(wchar_t** argv)
{
	lstrcpy(argv[0], L"sudoku.exe");
	lstrcpy(argv[1], L"-s");
	lstrcpy(argv[2], L"-c");
	lstrcpy(argv[3], L"200");

	closeTxt();
	if (interpret(4, argv) != -1)
		return;
	closeTxt();
	if (interpret(2, argv) != -1)
		return;

	lstrcpy(argv[0], L"sudoku.exe");
	lstrcpy(argv[1], L"-t");
	lstrcpy(argv[2], L"200");
	closeTxt();
	if (interpret(3, argv) != -1)
		return;

	lstrcpy(argv[1], L"-c");
	lstrcpy(argv[2], L"200.");
	closeTxt();
	if (interpret(3, argv) != -2)
		return;

	lstrcpy(argv[0], L"sudoku.exe");
	lstrcpy(argv[1], L"-c");
	lstrcpy(argv[2], L"0");
	closeTxt();
	if (interpret(3, argv) != 0)
		return;
	lstrcpy(argv[2], L"2000000");
	closeTxt();
	if (interpret(3, argv) != -3)
		return;

	lstrcpy(argv[2], L"10000000");
	closeTxt();
	if (interpret(3, argv) != -2)
		return;
}

void test()
{
	wchar_t* argv[10];
	for (int i = 0; i < 10; i++)
		argv[i] = new wchar_t[100];
	testInterpretor(argv);
	testMakingSudoku(argv);
	testSovlingSudoku(argv);
	for (int i = 0; i < 10; i++)
		delete[] argv[i];
}